package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// 1. 打印99乘法表
	for i := 1; i <= 9; i++ {
		for j := 1; j <= 9; j++ {
			if j <= i {
				fmt.Printf("%[2]d*%[1]d=%-3[3]d", i, j, i*j)
			}
		}
		fmt.Println()
	}
	fmt.Println("------------------------------------")
	// 2. 随机生成20以内的20个非0正整数并打印出来，对第奇数个进行累加和第偶数个累乘操作 并打印结果
	// 解析题目：
	// a. 累加和乘积操作的结果要先定义一个变量并初始化值 分别求和sum 乘积product
	// b. 定义一个以当前时间戳纳秒单位作为种子的随机数生成器
	// c. 在for循环里定义一个变量number 这个变量调用随机数生成器拿到随机数
	// d. 在每次循环后都打印这个变量number 逐个循环每个随机数并通过对索引i进行取模运算 判断是否奇偶数决定是奇数个加到sum变量里  偶数个乘到product的变量里 最后打印两个变量的值
	sum := 0
	product := 1
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i := 1; i <= 20; i++ {
		number := r.Intn(20) + 1 //（20）范围是0-19  (20) + 1 范围就是1-20
		if i%2 == 0 {
			product *= number
		} else {
			sum += number
		}
		fmt.Println(number)
	}
	fmt.Println(sum, product)
	fmt.Println("-----------------------------------------------------")
	// 3.1 打印100以内的斐波那契数列
	// 题目解析：
	// a. 斐波那契数列的规则是前两个数比如 a b相加之和总是等于第三个数
	// b. 那怎么限制让打印100以内的呢  定义一个limit变量并赋值100 添加判断>=limit时 break 否则就进行迭代相加
	// c. 定义一个int类型的切片 并初始化切片 0 1
	limit := 100
	fib := []int{0, 1}
	for {
		// 定义一个变量next_value用于获取下一个值 先通过len函数获取fib的总长度-1获取到切片中最后一个值的索引 通过-2获取上上个的值的索引 通过fib[索引]拿到前两个值 并相加赋值给变量
		next_value := fib[len(fib)-1] + fib[len(fib)-2]
		if next_value >= limit {
			break
		} else {
			fib = append(fib, next_value) // 如果获取到的值小于100 那么将这个值追加到切片中
		}
	}
	fmt.Println(fib) // 最后打印整个切片的内容
	fmt.Println("-----------------------------------------------------")

	// 3.2 打印100以内的斐波那契数列
	// 初始化斐波那契数列的前两个元素
	a, b := 0, 1
	// 使用循环打印斐波那契数列，直到数列中的数字超过给定的限制100
	for a <= 100 {
		// 打印当前斐波那契数
		fmt.Printf("%d ", a)
		// 计算下一个斐波那契数，并同时更新a和b的值；把b和a+b同时赋予给a和b
		a, b = b, a+b
		// 0 1 1 2 3 5 8 13 21 34 55 89
	}
}
